19172
15215
Jeg viser en liste over kontakter fra webservicen og viser den i kontakter 'sektioneret' tableView som vist på skærmbilledet.
Problemet er, at jeg får samme tagværdier for afkrydsningsfelter i første række til sektion A såvel som sektion S. Jeg har sorteret et array og vist i den indekserede tabelvisning. Sådan får du forskellige tagværdier afhængigt af indexPath.row uanset antal viste sektioner. Her er hvad jeg prøvede
I celleForRowAtIndexPath:
UIButton * checkBox;
hvis (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone)
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)];
}
andet
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)];
}
// int cnt = 0;
// for (int i = indexPath.section - 1; i> 0; i--)
// {
// cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters har char 'A' til 'Z'
//}
//checkBox.tag = cnt + indexPath.row;
[checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
[checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
returcelle;
}
- (ugyldigt) checkBoxClicked: (id) afsender
{
CGPoint buttonPosition = [sender convertPoint: CGPointZero toView: self.tableViewContact];
NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition];
UIButton * tappedButton = (UIButton *) afsender;
NSLog (@ "Tag nummer =% d", [afsender tag]);
if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])
{
[sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal];
hvis (indexPath! = Nil)
{
NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // gem afkrydsningsfelt-id'er i mutableArrayOfIds
NSLog (@ "Mærket markeret knap id =% @", finalIntId);
[arrayOfIds addObject: finalIntId];
}
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag];
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row];
}
andet
{
[sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
NSLog (@ "Ikke markeret");
// [arrayOfIds removeObjectAtIndex: tappedButton.tag];
}
}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) sektion {
if ([arrayOfCharacters count] == ​​0)
{
Vend tilbage @"";
}
returnere [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: afsnit]];
}
- (NSArray *) sektionIndexTitlesForTableView: (UITableView *) tableView
{
NSArray * toBeReturned = [NSArray arrayWithArray:
[@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # "
componentsSeparatedByString: @ "|"]];
vende tilbage til BeReturned;
}
- (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index
{
NSInteger count = 0;
for (NSString * tegn i arrayOfCharacters) {
hvis ([tegn erEqualToString: titel]) {
returantal
}
tælle ++;
}
returnere 0;
}
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
returnere [arrayOfCharacters count];
// return 1;
}
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sektion
{
// returnere [mutableArray count];
return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count];
} 
du indstiller den samme tagværdi for alle sektioner, der har samme række.
IndexPath har to egenskaber, {sektion, række}.
Lad os sige, at sektion A har to rækker,
for række1 -> indexPath.section = 0, indexPath.row = 0;
for række2-> indexPath.section = 0, indexPath.row = 1;
Lad os sige, at sektion S har to rækker,
for række1 -> indexPath.section = 1, indexPath.row = 0;
for række2-> indexPath.section = 1, indexPath.row = 1;
Så for række 1 i sektion A og række 1 i sektion S indstiller du den samme tagværdi, som er 0. Der er dit problem.
Prøv at indstille tagværdien som nedenfor.
button.tag = indexPath.section * 1000 + indexPath.row;
når du henter sektionen og rækken,
NSInteger sektion = (button.tag) / 1000;
NSInteger række = (button.tag)% 1000;
|
Prøv dette...
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
statisk NSString * CellIdentifier = @ "Cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
hvis (celle == nul) {
cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
}
UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)];
checkBox.backgroundColor = [UIColor orangeColor];
[checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
returcelle;
}
- (ugyldigt) checkBoxClicked: (id) afsenderhændelse: (id) begivenhed
{
NSSet * touches = [event allTouches];
UITouch * touch = [berører ethvert objekt];
CGPoint currentTouchPosition = [touch locationInView: self.tv]; // her er tv TableView-objekt
NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition];
NSLog (@ "værdi af indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row);
}
|
Dette sker, fordi du tildeler tag til knapper, Uafhængigt af sektioner.
Begge i første række af sektioner A og S har række = 0. så tag, der er tildelt deres respektive knap, er 0. Du skal tildele dem Behold henvisning til dine sektioner.
Jeg vil foreslå at tildele tilgængelighedstip med kommasepareret form indeholdende sektion, række.
Og i din metode
- (ugyldigt) checkBoxClicked: (id) afsender
{
// vælg streng fra kommaadskilt form. 1. er din sektion, 2. er række.
}
anden mulighed er Gør hvad nogensinde du laver og implementer din Button-metode som denne.
CGPoint buttonPosition = [afsender convertPoint: CGPointZero toView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition];
hvis (indexPath! = nul)
{
... indexpath.section er din sektion, index path.row er din række.
}
Der er også tredje mulighed.
i cellforRowAtIndexpath tildel din knap en titel
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
[btn setTitle: <# Your Row #> forState: UIControlStateDisabled];
[btn setTag <#Din sektion #>];
så ved modtagelse i din knapmetode kan du have både sektion (tag) og række (titel for deaktiveret tilstand).
- (ugyldigt) checkBoxClicked: (id) afsender {[knap titelForState: UIControlStateDisabled]; // din række
button.tag // din sektion}
|
Prøv dette!
Hver sektion kender du muligvis antallet af sektioner til højre, og tilføj derefter antallet af individuelle rækker.
[[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row
Hvor fieldTitlesList er matrixen for dine sektioner.
|
Jeg tilføjede følgende kode, der løste mit problem
NSInteger rowNumber = 0;
til (NSInteger i = 0; i